home *** CD-ROM | disk | FTP | other *** search
/ Aminet 37 / Aminet 37 (2000)(Schatztruhe)[!][Jun 2000].iso / Aminet / dev / lang / sofa.lha / sofa / smalleiffel / lib_std / collection2.e < prev    next >
Text File  |  2000-03-25  |  12KB  |  435 lines

  1. -- This file is  free  software, which  comes  along  with  SmallEiffel. This
  2. -- software  is  distributed  in the hope that it will be useful, but WITHOUT 
  3. -- ANY  WARRANTY;  without  even  the  implied warranty of MERCHANTABILITY or
  4. -- FITNESS  FOR A PARTICULAR PURPOSE. You can modify it as you want, provided
  5. -- this header is kept unaltered, and a notification of the changes is added.
  6. -- You  are  allowed  to  redistribute  it and sell it, alone or as a part of 
  7. -- another product.
  8. --          Copyright (C) 1994-98 LORIA - UHP - CRIN - INRIA - FRANCE
  9. --            Dominique COLNET and Suzanne COLLIN - colnet@loria.fr 
  10. --                       http://SmallEiffel.loria.fr
  11. --
  12. deferred class COLLECTION2[E]
  13.    -- 
  14.    -- Abstract definition of a 2 dimensional collection of elements
  15.    -- of type E. 
  16.    -- 
  17.    -- The SmallEiffel standard library (lib_std) provides two
  18.    -- implementations : ARRAY2[E] and FIXED_ARRAY2[E].
  19.    -- All implementations have exactly the same behavior. Switching 
  20.    -- from one implementation to another only change the memory used
  21.    -- and the execution time.
  22.    --
  23.  
  24. inherit
  25.    ANY
  26.       undefine copy, is_equal
  27.       redefine fill_tagged_out_memory
  28.       end;
  29.    
  30. feature -- Indexing :
  31.    
  32.    lower1, lower2: INTEGER is
  33.          -- Lower index bounds.
  34.       deferred
  35.       end;
  36.    
  37.    frozen line_minimum: INTEGER is
  38.          -- Equivalent of `lower1'.
  39.       do
  40.          Result := lower1;
  41.       end;
  42.    
  43.    frozen column_minimum: INTEGER is
  44.          -- Equivalent of `lower2'.
  45.       do
  46.          Result := lower2;
  47.       end;
  48.    
  49.    upper1, upper2: INTEGER is
  50.          -- Upper index bounds.
  51.       deferred
  52.       end;
  53.    
  54.    frozen line_maximum: INTEGER is
  55.          -- Equivalent of `upper1'.
  56.       do
  57.          Result := upper1;
  58.       end;
  59.  
  60.    frozen column_maximum: INTEGER is
  61.          -- Equivalent of `upper2'.
  62.       do
  63.          Result := upper2;
  64.       end;
  65.    
  66. feature -- Reading :
  67.    
  68.    item(line, column: INTEGER): E is
  69.       require
  70.          valid_index(line,column);
  71.       deferred
  72.       end;
  73.    
  74. feature -- Writing :
  75.    
  76.    put(element: like item; line, column: INTEGER) is
  77.       require
  78.          valid_index(line,column);
  79.       deferred
  80.       ensure
  81.          item(line,column) = element
  82.       end;
  83.  
  84.    force(element: like item; line, column: INTEGER) is
  85.          -- Put `element' at position (`line',`column'). Collection is
  86.          -- resized first when (`line',`column') is not inside current
  87.          -- bounds. New bounds are initialized with default values.
  88.       require
  89.          line >= 0;
  90.          column >= 0
  91.       deferred
  92.       ensure
  93.          item(line,column) = element;
  94.          count >= old count;
  95.       end;
  96.  
  97. feature -- Index validity :
  98.    
  99.    frozen valid_line, valid_index1(line: INTEGER): BOOLEAN is
  100.       do
  101.          Result := lower1 <= line and then line <= upper1;
  102.       ensure
  103.          Result = (lower1 <= line and line <= upper1)
  104.       end;
  105.    
  106.    frozen valid_column, valid_index2(column: INTEGER): BOOLEAN is
  107.       do
  108.          Result := lower2 <= column and then column <= upper2;
  109.       ensure
  110.          Result = (lower2 <= column and column <= upper2)
  111.       end;
  112.    
  113.    frozen valid_index(line, column: INTEGER): BOOLEAN is
  114.       do
  115.          Result := ((lower1 <= line) and then (line <= upper1) 
  116.                     and then
  117.                     (lower2 <= column) and then (column <= upper2)); 
  118.       ensure
  119.          Result = (valid_line(line) and valid_index2(column))
  120.       end;
  121.  
  122. feature -- Counting :
  123.  
  124.    count1: INTEGER is
  125.          -- Size of the first dimension.
  126.       deferred
  127.       ensure
  128.          Result = upper1 - lower1 + 1;
  129.       end;
  130.    
  131.    frozen line_count: INTEGER is
  132.          -- Equivalent of `count1'.
  133.       do
  134.          Result := count1;
  135.       end;
  136.    
  137.    count2: INTEGER is
  138.          -- Size of the second dimension.
  139.       deferred
  140.       ensure
  141.          Result = upper2 - lower2 + 1;
  142.       end;
  143.    
  144.    frozen column_count: INTEGER is
  145.       do
  146.          Result := count2;
  147.       end;
  148.    
  149.    count: INTEGER is
  150.          -- Total number of elements.
  151.       deferred
  152.       ensure
  153.          Result = line_count * column_count
  154.       end;
  155.  
  156. feature 
  157.    
  158.    swap(line1, column1, line2, column2: INTEGER) is
  159.          -- Swap the element at index (`line1',`column1') with the
  160.          -- the element at index (`line2',`column2').
  161.       require
  162.          valid_index(line1,column1);
  163.          valid_index(line2,column2)
  164.       deferred
  165.       ensure
  166.          item(line1,column1) = old item(line2,column2);
  167.          item(line2,column2) = old item(line1,column1);
  168.          count = old count
  169.       end;
  170.    
  171.    set_all_with(v: like item) is
  172.          -- Set all item with value `v'.
  173.       deferred
  174.       ensure
  175.          count = old count
  176.       end;
  177.    
  178.    frozen clear_all is
  179.          -- Set all items to default values.
  180.       local
  181.          value: like item;
  182.       do
  183.          set_all_with(value);
  184.       ensure
  185.          count = old count;
  186.       end;
  187.  
  188. feature -- Creating or initializing :
  189.  
  190.    from_collection2(model: COLLECTION2[like item]) is
  191.          --  Uses `model' to initialize Current.
  192.       require
  193.          model /= Void
  194.       deferred
  195.       ensure
  196.          count1 = model.count1;
  197.          count2 = model.count2
  198.       end;
  199.  
  200.    from_model(model: COLLECTION[COLLECTION[E]]) is
  201.          -- The `model' is used to fill line by line Current.
  202.          -- Assume all sub-collections of `model' have the same
  203.          -- number of lines.
  204.       require
  205.          model /= Void
  206.       deferred
  207.       ensure
  208.          count1 = model.count;
  209.          count2 > 0 implies count2 = model.first.count 
  210.       end;
  211.  
  212. feature -- Looking and comparison :
  213.    
  214.    all_default: BOOLEAN is
  215.          -- Do all items have their type's default value?
  216.       deferred
  217.       end;
  218.  
  219.    frozen all_cleared: BOOLEAN is
  220.       obsolete "The new name of this feature is `all_default'."
  221.       do
  222.       Result := all_default;
  223.       end;
  224.  
  225.    same_as(other: COLLECTION2[E]): BOOLEAN is
  226.          -- Unlike `is_equal', this feature can be used to compare
  227.          -- distinct implementation of COLLECTION2.
  228.       require
  229.          other /= Void
  230.       deferred
  231.       ensure
  232.          Result implies standard_same_as(other)
  233.       end;
  234.  
  235. feature -- Printing :
  236.    
  237.    frozen fill_tagged_out_memory is
  238.       local
  239.          line, column: INTEGER;
  240.          v: like item;
  241.       do
  242.          tagged_out_memory.append("lower1: "); 
  243.          lower1.append_in(tagged_out_memory);
  244.          tagged_out_memory.append(" upper1: "); 
  245.          upper1.append_in(tagged_out_memory);
  246.          tagged_out_memory.append(" lower2: "); 
  247.          lower2.append_in(tagged_out_memory);
  248.          tagged_out_memory.append(" upper2: "); 
  249.          upper2.append_in(tagged_out_memory);
  250.          tagged_out_memory.append(" [%N");
  251.          from
  252.             line := lower1;
  253.          until
  254.             line > upper1
  255.                or else
  256.             tagged_out_memory.count > 4096
  257.          loop
  258.             tagged_out_memory.append("line ");
  259.             line.append_in(tagged_out_memory);
  260.             tagged_out_memory.append("%T: ");
  261.             from
  262.                column := lower2;
  263.             until
  264.                column > upper2
  265.             loop
  266.                v := item(line,column);
  267.                if v = Void then
  268.                   tagged_out_memory.append("Void");
  269.                else
  270.                   v.out_in_tagged_out_memory;
  271.                end;
  272.                tagged_out_memory.extend(' ');
  273.                column := column + 1;
  274.             end;
  275.             tagged_out_memory.extend('%N');
  276.             line := line + 1;
  277.          end;
  278.          if valid_line(line) then
  279.             tagged_out_memory.append("......%N"); 
  280.          end;
  281.       end;
  282.  
  283. feature -- Miscellaneous features :
  284.  
  285.    nb_occurrences(elt: E): INTEGER is
  286.          -- Number of occurrences using `equal'.
  287.          -- See also `fast_nb_occurrences' to chose
  288.          -- the apropriate one.
  289.       deferred
  290.       ensure
  291.          Result >= 0;
  292.       end;
  293.    
  294.    fast_nb_occurrences(elt: E): INTEGER is
  295.          -- Number of occurrences using `='.
  296.       deferred
  297.       ensure
  298.          Result >= 0;
  299.       end;
  300.  
  301.    has(x: like item): BOOLEAN is
  302.          -- Search if a element x is in the array using `equal'.
  303.          -- See also `fast_has' to chose the apropriate one.
  304.       deferred
  305.       end;
  306.    
  307.    fast_has(x: like item): BOOLEAN is
  308.          --  Search if a element x is in the array using `='.
  309.       deferred
  310.       end;
  311.    
  312.    replace_all(old_value, new_value: like item) is
  313.          -- Replace all occurences of the element `old_value' by `new_value' 
  314.          -- using `equal' for comparison.
  315.          -- See also `fast_replace_all' to choose the apropriate one.
  316.       deferred
  317.       ensure
  318.          count = old count;
  319.          nb_occurrences(old_value) = 0
  320.       end;
  321.    
  322.    fast_replace_all(old_value, new_value: like item) is
  323.          -- Replace all occurences of the element `old_value' by `new_value' 
  324.          -- using operator `=' for comparison.
  325.          -- See also `replace_all' to choose the apropriate one.
  326.       deferred
  327.       ensure
  328.          count = old count;
  329.          fast_nb_occurrences(old_value) = 0
  330.       end;
  331.  
  332.    sub_collection2(line_min, line_max, 
  333.                    column_min, column_max: INTEGER): like Current is
  334.          -- Create a new object using selected area of `Current'.
  335.       require
  336.          valid_index(line_min,column_min);
  337.          valid_index(line_min,column_min)
  338.       deferred
  339.       ensure
  340.          Result /= Void
  341.       end;
  342.  
  343.    set_area(element: like item; 
  344.             line_min, line_max, column_min, column_max: INTEGER) is
  345.          -- Set all the elements of the selected area rectangle with `element'.
  346.       require
  347.          valid_index(line_min,line_max); 
  348.          valid_index(column_min,column_max)
  349.       local
  350.          line, column : INTEGER;
  351.       do
  352.          from
  353.             line := line_min;
  354.          until
  355.             line > line_max
  356.          loop
  357.             from
  358.                column := column_min
  359.             until
  360.                column > column_max
  361.             loop
  362.                put(element,line,column);
  363.                column := column + 1;
  364.             end;
  365.             line := line + 1;
  366.          end;
  367.       ensure
  368.          count = old count;
  369.       end;
  370.  
  371. feature {COLLECTION2} -- For `same_as' implementation :
  372.  
  373.    frozen standard_same_as(other: COLLECTION2[E]): BOOLEAN is
  374.       require
  375.          generating_type /= other.generating_type
  376.       local
  377.          line, column: INTEGER;
  378.       do
  379.          if lower1 /= other.lower1 then
  380.          elseif upper1 /= other.upper1 then
  381.          elseif lower2 /= other.lower2 then
  382.          elseif upper2 /= other.upper2 then
  383.          else
  384.             from
  385.                Result := true;
  386.                line := upper1;
  387.             until
  388.                not Result or else line < lower1
  389.             loop
  390.                from
  391.                   column := upper2;
  392.                until
  393.                   not Result or else column < lower2
  394.                loop
  395.                   Result := equal_like(item(line,column),other.item(line,column));
  396.                   column := column - 1;
  397.                end;
  398.                line := line - 1;
  399.             end;
  400.          end;
  401.       end;
  402.  
  403.    same_as_array2(other: ARRAY2[E]): BOOLEAN is
  404.       require
  405.          other /= Void
  406.       deferred
  407.       end;
  408.    
  409.    same_as_fixed_array2(other: FIXED_ARRAY2[E]): BOOLEAN is
  410.       require
  411.          other /= Void
  412.       deferred
  413.       end;
  414.    
  415. feature {NONE}
  416.    
  417.    frozen equal_like(e1, e2: like item): BOOLEAN is
  418.          -- Note: this feature is called to avoid calling `equal'
  419.          -- on expanded types (no automatic conversion to 
  420.          -- corresponding reference type).
  421.       do
  422.          if e1.is_basic_expanded_type then
  423.             Result := e1 = e2;
  424.          elseif e1.is_expanded_type then
  425.             Result := e1.is_equal(e2);
  426.          elseif e1 = e2 then
  427.             Result := true;
  428.          elseif e1 = Void or else e2 = Void then
  429.          else
  430.             Result := e1.is_equal(e2);
  431.          end;
  432.       end;
  433.  
  434. end -- COLLECTION2[E]
  435.